//043. 子串可整除性
//        数字 1406357289 由 0 至 9 的各位数构成，因此是一个 0 至 9 的全数字，除此之外，它还有
//        一个有趣的子串可整除性质。设 d1 表示第一位数，d2 表示第二位数等等，可以发现：
//        求所有满足这个性质的 0 至 9 的全数字之和。
//        答案：16695334890
//        （满足条件的全数字有 6 个：1406357289, 1430952867, 1460357289, 4106357289, 4130952867,
//        4160357289）

public class Week043 {
    static int[] primes = {0, 2, 3, 5, 7, 11, 13, 17};

    static boolean check(String s) {
        for (int i = 1; i <= 7; ++i) {
            if (Integer.parseInt(s.substring(i, i + 3)) % primes[i] != 0) {
                return false;
            }
        }
        return true;
    }

    static final int N = 10;
    static int[] nums = new int[N];
    static boolean[] book = new boolean[N];
    static long ans = 0;

    static void dfs(int len) {
        if (len == N) {
            StringBuilder cur = new StringBuilder("");
            for (int i = 0; i < N; ++i) cur.append(nums[i]);
            String s = cur.toString();
            if (check(s)) ans += Long.parseLong(s);
            return;
        }
        for (int i = 0; i < N; ++i) {
            if (book[i]) continue;
            nums[len] = i;
            book[i] = true;
            dfs(len + 1);
            book[i] = false;
        }
    }

    static void run() {
        for (int i = 1; i < N; ++i) {
            nums[0] = i;
            book[i] = true;
            dfs(1);
            book[i] = false;
        }
        System.out.println(ans);
    }

    public static void main(String[] args) {
        long startTime = System.nanoTime();
        run();
        System.out.println("\n程序运行时间：" + (System.nanoTime() - startTime) + "ns.");
    }
}
